package EnrynHsu.affiliate;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Scanner;

/**
 * 控制台实现
 */
public class cmd_Impl {
    /**
     * 这是外部入口.
     * @param args 外部参数
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        if (args.length > 0){
            if (args.length == 4) {

                if (args[0].equals("-o")) {
                    Resolver.engine = Resolver.highEngine;
                    try {
                        int a = Integer.parseInt(args[3]);
                        if (!(a >= 1)) {
                            System.out.println("limit不能使用1，>=1且为整数");
                            System.exit(1);
                        } else HighEngine.limit = a;
                    } catch (Exception e) {
                        System.out.println("输入错误：必须>=1且为整数");
                        System.exit(1);
                    }

                    try (var file = new FileOutputStream(args[1])) {
                        file.write(Resolver.resolve(args[2]).getBytes());
                    } catch (Exception e) {
                        System.out.println("出错了");
                        System.exit(1);
                    }
                }
            } else {
                System.out.println("you should input:-o output_file_name expression");
            }
        }

        else {
            final Scanner scanner = new Scanner(System.in);
            while (true) {
                System.out.print(">>>");
                try {
                    enter(new String[]{scanner.nextLine()});
                } catch (ExpressParseException | ArithmeticException | ComputeException | NumberFormatException e) {
                    System.out.println("错误：" + e.getMessage());
                    ;
                } catch (Exception exception) {
                    exception.printStackTrace(new PrintWriter(Files.newOutputStream(Paths.get("C:\\ResolverLog.txt"))));
                    System.out.println("程序发生了错误，请联系作者。@gitee:开发框架");
                    System.exit(0);
                }
            }
        }
    }

    /**
     * 这是内部解析接口.
     * @param args 参数数组
     * @throws ExpressParseException
     */
    public static void enter(String[] args) throws ExpressParseException{
        switch (args[0]) {
            case "help" -> System.out.print("""
                            ---可用运算符列表---
                            ###第一级运算符###
                            + 加法运算符
                            - 减法运算符
                            ###第二级运算符###
                            * 乘法运算符
                            / 除法运算符
                            % 取余运算符：操作数只能为整数
                            # 取商运算符：操作数只能为整数
                            & 按位且运算符：操作数只能为整数
                            | 按位或运算符：操作数只能为整数
                            ~ 按位异或运算符：操作数只能为整数
                            ###第三级运算符###
                            ^ 指数运算符
                              返回的结果为小数
                            ###第四级运算符###
                            @ 对数运算符：求值数@底数
                              返回的结果为小数
                            
                            ---可用指令---
                            low：使用低精度引擎                                              
                            high：使用高精度引擎                                                
                            limit：按下回车后，极限小数点位数。最大不能超过INT_MAX                                                
                            exit：退出                                          
                            cat：查看可爱的小猫                                                
                            其他指令作为彩蛋。
                            """);
            case "version" -> System.out.print("""
                    @Author:EnrynHsu all rights reserved
                    @Version:1.0 SNAPSHOT
                    @Comment:Happy
                    """);
            case "cat" -> System.out.println("""
                    　 ∧_∧　　　　∧_∧　　　∧_∧　　　　∧_∧　　　  \s
                    　（^ .^）　　（^ 、^）　 （^ 0^）　  （^ Д^）  \s
                    ----∪-∪-------∪-∪-------∪-∪-------∪-∪---\s""");
            case "horse" -> System.out.println("""
                                               _(\\_/)\s
                                             ,((((^`\\
                                             ((((  (6 \\\s
                                          ,((((( ,    \\
                       ,,,_              ,(((((  /"._  ,`,
                      ((((\\\\ ,...       ,((((   /    `-.-'
                      )))  ;'    `"'"'""((((   (     \s
                    (((  /            (((      \\
                      )) |                      |
                     ((  |        .       '     |
                     ))  \\     _ '      `t   ,.')
                     (   |   y;- -,-""'"-.\\   \\/ \s
                    )   / ./  ) /         `\\  \\
                        |./   ( (           / /'
                        ||     \\\\          //'|
                        ||      \\\\       _//'||
                        ||       ))     |_/  ||
                        \\_\\     |_/          ||
                        `'"                  \\_\\
                                             `'\"""".indent(4));
            case "love" -> System.out.println("""
                    送给你....
                    　　　　\\.　-　 -　.　　
                    　　　 '　　 情　 _ , -`.
                    　　 '　　　　_,'　　 _,'
                    　　'　　　,-'　　　_/ 同
                    　 ' 爱 ,-' \\　　 _/　 顶
                    　'　 ,'　　 \\　_'　　 一
                    　'　'　　　 _\\'　　　 片
                    　' ,　　_,-'　\\　　　 蓝
                    　\\,_,--'　　　 \\　　　天""");
            case "heart" -> System.out.println("""
                    *##############
                    ################
                    ##################                     **##*  \s
                    ##################            *#########
                    #################           ############
                       #################* ################*
                        #################################*
                          ############################### \s
                           #############################=
                            =########################## \s
                               *######################= \s
                                *####################
                                  *#################
                                    *############## \s
                                       ###########
                                        *########* \s
                                            ###### \s
                                               #### \s
                                                 ### \s
                                                    ##
                                                       #""");
            case "exit" -> System.exit(0);
            case "high" -> {
                Resolver.engine = Resolver.highEngine;
                System.out.println("切换成功");
            }
            case "low" -> {
                Resolver.engine = Resolver.nativeEngine;
                System.out.println("切换成功");
            }
            case "limit" -> {
                try {
                    int a = new Scanner(System.in).nextInt();
                    if (!(a >= 1)) throw new ComputeException("不能使用1，>=1且为整数");
                    else HighEngine.limit = a;
                } catch (Exception e) {
                    System.out.println("输入错误：必须>=1且为整数");
                }
            }
            default -> System.out.println(Resolver.resolve(args[0]));
        }
    }
}
